import asyncio
import contextvars

# 用户上下文
user_context = contextvars.ContextVar('user', default=None)

async def get_current_user():
    return user_context.get()

async def run_as_user(user, coro):
    # 保存当前用户
    token = user_context.set(user)
    try:
        # 执行协程
        return await coro
    finally:
        # 恢复之前的用户
        user_context.reset(token)

async def some_operation():
    user = await get_current_user()
    print(f"当前操作由用户 {user} 执行")

# 使用示例
async def main():
    # 默认没有用户
    await some_operation()  # 输出: 当前操作由用户 None 执行
    
    # 以特定用户身份执行
    await run_as_user('张三', some_operation())  # 输出: 当前操作由用户 张三 执行
    
    # 用户上下文不会泄漏到外部
    await some_operation()  # 输出: 当前操作由用户 None 执行

asyncio.run(main())